"use strict"

var urlPrefix = 'http://127.0.0.1:8080/AutoTest';

function setPRODUCT(s) {
	
	document.cookie="PRODUCT=" + s;
	console.info("setPRODUCT: " + getCookie("PRODUCT"));
	return true;
}

function setVERSION(s) {
	document.cookie="VERSION=" + s;
	console.info("setVERSION: " + getCookie("VERSION"));
	return true;
}

function getCookie(name) {
	
	var search = name + "="//查询检索的值
	var returnvalue = "";//返回值
   
	if (document.cookie.length > 0) {
		var sd = document.cookie.indexOf(search);
		if (sd!= -1) {
			sd += search.length;
			var end = document.cookie.indexOf(";", sd);
			if (end == -1) {
				end = document.cookie.length;
			}
			//unescape() 函数可对通过 escape() 编码的字符串进行解码。
			returnvalue=unescape(document.cookie.substring(sd, end))
		}
   } 
   return returnvalue;
}

/**
 * 获取url参数信息
 * name：参数的名称
 */
function getParam(name) {
	
	var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
	console.info('reg: ' + reg);
	
	var r = window.location.search.substr(1).match(reg);
	console.info('r: ' + r);
	
	if (r != null) {
		return decodeURI(r[2]);
	}
	return null;
}

/**
 * Post请求Json
 * urlParam：url后缀
 * bodyParam：POST的body
 */
function doPostJson(urlParam, bodyParam) {

	console.info("开启loadding");
	$('#loading').show();

	console.info("doPostJson: " + urlParam + "::" + bodyParam);
	var responseJson = $.parseJSON($.ajax({
		async: false,
		type: 'post',
		contentType: 'application/json',
		url: urlPrefix + urlParam,
		data: bodyParam
	}).responseText);

	console.info("关闭loadding");
	$('#loading').hide();

	return responseJson;
}

/**
 * Get请求Json
 * urlParam：url后缀
 * bodyParam：POST的body
 */
function doGetJson(urlParam) {

	console.info("开启loadding");
	$('#loading').show();

	console.info("doGetJson: " + urlParam);
	var responseJson = $.parseJSON($.ajax({
		async: false,
		type: 'get',
		contentType: 'application/json',
		url: urlPrefix + urlParam
	}).responseText);

	console.info("关闭loadding");
	$('#loading').hide();

	return responseJson;
}

/**
 * 获取表单json数据
 * eg：var jsonData = $("#demoForm").serializeObject();
 */
$.fn.serializeObject = function() {
	var o = {};
	var a = this.serializeArray();
	$.each(a, function() {
		if (o[this.name]) {
			if (!o[this.name].push) {
				o[this.name] = [o[this.name]];
			}
			o[this.name].push(this.value || '');
		} else {
			o[this.name] = this.value || '';
		}
	});
	return o;
}

/**
 * 查询所有的产品名称
 * 需要把用户的name传递过去
 */
function searchProduct() {

	var responseJson = doPostJson("/product/search", '{"role":"admin"}');
	console.info("查询到的产品数据：" + JSON.stringify(responseJson));

	// 先清除一下ul
	$("#productlist").empty();

	// 更新前台页面
	var innerHtml = '';
	innerHtml = innerHtml + '<li><a href="#" data-toggle="modal" data-target="#productCreateModal">创建一个新产品</a></li>';
	for (var i in responseJson) {
		innerHtml = innerHtml + '<li>';
		innerHtml = innerHtml + '<a href="product.html" onclick="setPRODUCT(this.text)">' + responseJson[i].name + '</a>';
		innerHtml = innerHtml + '</li>';
	}
	// 结尾多添加一行，好看一点
	innerHtml = innerHtml + '<li><a href="#"></a></li>';
	
	// 这一行不知道为什么执行会出错
	// $('#productlist').metisMenu('dispose');
	// 添加内容
	$("#productlist").html(innerHtml);
	// 重要！重新初始化一下菜单，否则不能实现收缩
	$('#productlist').metisMenu();
};

/**
 * 点击"创建一个新版本"的时候，更新一下选中的版本名称
 */
function selectProduct_1(obj) {
	
	console.info(obj.parentElement.parentElement.previousElementSibling.text.trim());
	
	// 设置一下当前选中的产品名称
	setPRODUCT(obj.parentElement.parentElement.previousElementSibling.text.trim());
}

/**
 * 查询产品下所有版本
 */
function searchProductVersion() {
	
	var responseJson = doPostJson("/product/version/search", '{"productname":"' + getCookie('PRODUCT') + '"}');
	console.info("查询到的版本数据：" + JSON.stringify(responseJson));
	
	// 这里记录两个方法，暂时用不到
	// 将数据清除
	// $('#dataTables-versions').dataTable().fnClearTable();
	// 添加新数据，数据必须是json对象或json对象数组
	// $('#example').dataTable().fnAddData(data, true);
	
	$('#dataTables-versions').DataTable({
		destroy: true,
		pageLength: 10,
		responsive: true,
		dom: '<"html5buttons"B>lTfgitp',
		buttons: [
			{extend: 'copy'},
			{extend: 'csv'},
			{extend: 'excel', title: 'ExampleFile'},
			{extend: 'pdf', title: 'ExampleFile'},
			{
				extend: 'print',
				customize: function(win) {
					$(win.document.body).addClass('white-bg');
					$(win.document.body).css('font-size', '10px');
	
					$(win.document.body).find('table')
						.addClass('compact')
						.css('font-size', 'inherit');
				}
			}
		],
		columns: [
			{data: 'name'},
			{data: 'date'},
			{data: 'case_count'},
			{data: 'exec_rate'},
			{data: 'pass_rate'},
			{data: 'auto_rate'}
		],
		data: responseJson.data
	});
}

/**
 * 创建一个产品
 */
function createProduct() {

	console.info($("#productCreateForm"));
	var paramBody = JSON.stringify($("#productCreateForm").serializeObject());

	var responseJson = doPostJson("/product/create", paramBody);
	console.info("创建产品结果：" + JSON.stringify(responseJson));

	// 判断一下响应，如果成功了弹窗成功提示，如果失败了弹窗失败提示
	// 成功提示点击之后关闭模态框，失败提示点击之后不关闭模态框
	if (responseJson.success) {
		swal({
			title: "Success",
			text: responseJson.message,
			type: "success"

		}, function(isConfirm) {
			$('#productCreateModal').modal('hide');
		});
	} else {
		swal({
			title: "Error",
			text: responseJson.message,
			type: "error"
		}, function(isConfirm) {

		});
	}
	
	// 创建后更新一下页面
	searchProduct();
}

/**
 * 产品下创建版本
 */
function createProductVersion() {
	
	console.info($("#versionCreateForm"));
	var paramBodyJson = $("#versionCreateForm").serializeObject();
	
	// 添加一下产品信息
	paramBodyJson.productname = getCookie('PRODUCT');
	
	var paramBody = JSON.stringify(paramBodyJson);

	var responseJson = doPostJson("/product/version/create", paramBody);
	console.info("创建产品结果：" + JSON.stringify(responseJson));

	// 判断一下响应，如果成功了弹窗成功提示，如果失败了弹窗失败提示
	// 成功提示点击之后关闭模态框，失败提示点击之后不关闭模态框
	if (responseJson.success) {
		swal({
			title: "Success",
			text: responseJson.message,
			type: "success"

		}, function(isConfirm) {
			$('#versionCreateModal').modal('hide');
			
			// 创建后更新一下页面
			searchProduct();
			searchProductVersion();
		});
	} else {
		swal({
			title: "Error",
			text: responseJson.message,
			type: "error"
		}, function(isConfirm) {

		});
	}
}

/**
 * 删除一个产品
 */
function deleteProduct() {

	// 改成使用Cookie了
	// var paramBody = '{"name": "' + getParam('product') + '"}';
	
	swal({
			title: "删除产品：" + getCookie("PRODUCT"),
			text: "该操作将删除产品 \"" + getCookie("PRODUCT") + "\" 下的所有数据，包括版本数据，用例数据，脚本数据。不可恢复！",
			type: "warning",
			showCancelButton: true,
			confirmButtonColor: "#DD6B55",
			confirmButtonText: "删除",
			cancelButtonText: "取消",
			closeOnConfirm: false,
			closeOnCancel: false,
		},function (isConfirm) {
			
			if (isConfirm) {
				
				var paramBody = '{"name": "' + getCookie("PRODUCT") + '"}';
				var responseJson = doPostJson("/product/delete", paramBody);
				console.info("删除产品结果：" + JSON.stringify(responseJson));
				
				// 判断一下响应，如果成功了弹窗成功提示，如果失败了弹窗失败提示
				if (responseJson.success) {
					swal({
						title: "Success",
						text: responseJson.message,
						type: "success"
					}, function(isConfirm) {
						// 删除成功后跳转到首页
						window.location.href='index.html'
					});
				} else {
					swal({
						title: "Error",
						text: responseJson.message,
						type: "error"
					}, function(isConfirm) {
						// 删除成功后跳转到首页
						window.location.href='index.html'
					});
				}
			} else {
				swal("取消", "操作已取消", "error");
			}
		});
}

/**
 * 产品下删除一个版本
 */
function deleteProductVersion() {

	swal({
			title: "删除产品" + getCookie("PRODUCT") + "下版本：" + getCookie("VERSION"),
			text: "该操作将删除产品" + getCookie("PRODUCT") + "\下版本 \"" + getCookie("VERSION") + "\" 的所有数据，包括用例数据，脚本数据。不可恢复！",
			type: "warning",
			showCancelButton: true,
			confirmButtonColor: "#DD6B55",
			confirmButtonText: "删除",
			cancelButtonText: "取消",
			closeOnConfirm: false,
			closeOnCancel: false,
		},function (isConfirm) {
			
			if (isConfirm) {
				
				var paramBody = '{"productname":"' + getCookie("PRODUCT") + '","versionname":"' + getCookie("VERSION") + '"}';
				var responseJson = doPostJson("/product/version/delete", paramBody);
				console.info("删除版本结果：" + JSON.stringify(responseJson));
				
				// 判断一下响应，如果成功了弹窗成功提示，如果失败了弹窗失败提示
				if (responseJson.success) {
					swal({
						title: "Success",
						text: responseJson.message,
						type: "success"
					}, function(isConfirm) {
						// 删除成功后跳转到首页
						window.location.href='product.html'
					});
				} else {
					swal({
						title: "Error",
						text: responseJson.message,
						type: "error"
					}, function(isConfirm) {
						// 删除成功后跳转到首页
						window.location.href='product.html'
					});
				}
			} else {
				swal("取消", "操作已取消", "error");
			}
		});
}

/**
 * 下面三个方法负责动态调整两个div的大小
 */
function bindResize(el) {
	
	// 获取父元素宽度
	var parent_width = $("#pageright").parent().width();
	
	//初始化参数
	var els = document.getElementById('pageleft').style;
	var elr = document.getElementById('pageright').style;
	//鼠标的 X 和 Y 轴坐标
	var x = 0;
	//邪恶的食指
	$(el).mousedown(function(e) {
		//按下元素后，计算当前鼠标与对象计算后的坐标
		x = e.clientX - el.offsetWidth - $("#pageleft").width();
		//在支持 setCapture 做些东东
		el.setCapture ? (
			//捕捉焦点
			el.setCapture(),
			//设置事件
			el.onmousemove = function(ev) {
				mouseMove(ev || event);
			},
			el.onmouseup = mouseUp
		) : (
			//绑定事件
			$(document).bind("mousemove", mouseMove).bind("mouseup", mouseUp)
		);
		//防止默认事件发生
		e.preventDefault();
	});
	//移动事件
	function mouseMove(e) {
		//宇宙超级无敌运算中...
		els.width = e.clientX - x + 'px';
		elr.width = $("#pageright").parent().width() - $("#pageleft").width() - 100 + 'px';
	}
	//停止事件
	function mouseUp() {
		//在支持 releaseCapture 做些东东
		el.releaseCapture ? (
			//释放焦点
			el.releaseCapture(),
			//移除事件
			el.onmousemove = el.onmouseup = null
		) : (
			//卸载事件
			$(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp)
		);
	}
}
function divResize() {
	// var totalHeight = $("html").height();
	var totalHeight = 600;
	$("#pageleft").height(totalHeight);
	$("#pageseparator").height(totalHeight);
	$("#pageright").height(totalHeight);
}
function initResize() {
	divResize();
	$(window).resize(divResize);
	bindResize(document.getElementById('pageseparator'));
}

function initDropzone() {
	Dropzone.options.dropzoneForm = {
		url: urlPrefix + "/upload/case/excel/" + getCookie("PRODUCT") + "/" + getCookie("VERSION"),
		paramName: "file", // The name that will be used to transfer the file
		maxFilesize: 1.0, // MB
		maxFiles: 10000,
		acceptedFiles: ".xls,.xlsx",
		dictFileTooBig:"文件过大({{filesize}}MB). 上传文件最大支持: {{maxFilesize}}MB.",
		dictInvalidFileType: "你不能上传该类型文件,文件类型只能是*.xls/*.xlsx。",
		dictDefaultMessage: "<strong>拖拽/选择用例文件上传</strong>",
		init: function() {
			//上传文件时触发的事件
			this.on("addedfile", function(file) { 
				//浏览器控制台输出js
				console.log("File " + file.name + "uploaded");
			});
			//上传文件成功时触发的事件
			this.on("success", function(file, response) {
				console.log("File " + file.name + "uploaded");
				console.info(response);
				
				// 如果返回消息为成功
				if (response.success) {
					swal({
						title: response.message,
						text: JSON.stringify(response.detail),
						type: "success"
					}, function(isConfirm) {
						$("#caseImportModal").modal('hide');
					});
					initZtree();
				} else {
					swal({
						title: response.message,
						text: JSON.stringify(response.detail),
						type: "error"
					}, function(isConfirm) {
						
					});
				}
				
			});
			//移除文件触发的事件
			this.on("removedfile", function(file) {
				console.log("File " + file.name + "removed");
			});
		} 
	};
}

/**
 * 用例树的设置：带复选框
 */
var casezTreeSetting = {

	check: {
		enable: true
	},
	data: {
		simpleData: {
			enable: true
		}
	},
	callback: {
		onClick: casezTreeOnClick
	}
};

/**
 * TODO
 * 用例树的点击行为
 */
function casezTreeOnClick(event, treeId, treeNode) {
	
	// 这个地方需要判断一下点击的是folder节点还是case节点
	// 根据treeNode.num是否存在判断
	if (treeNode.num == undefined) {
		console.info("folder node: ", treeNode);
		// 调用显示文件夹区块的方法
		initcasefolderdetail(treeNode);
	} else {
		console.info("case node: ", treeNode);
		// 调用显示用例详情区块的方法
		initcasedetail(treeNode);
	}
}

function initZtree() {
	// 绘制ztree
	$.fn.zTree.init($("#caseztree"), casezTreeSetting, 
		doPostJson("/case/baseinfo", '{"product": "' + getCookie('PRODUCT') + '","version": "'+ getCookie('VERSION') +'","role": "admin"}').detail);
}

function initcasedetail(treeNode) {
	
	// 可以在这里修改用例，查看用例详情等
	$("#folderpage").css("display", "none");
	$("#casepage").css("display", "block");
	
	var responseJson = doPostJson('/case/detail', '{"product":"' + getCookie('PRODUCT') + '","version":"' + getCookie('VERSION') + '","num":"' + treeNode.num + '"}');
	
	if (responseJson.success) {
		// 页面信息填充
		$("#case-name").val(responseJson.detail.name);
		$("#case-num").val(responseJson.detail.num);
		$("#case-level").val(responseJson.detail.level);
		$("#case-lastresult").val(responseJson.detail.lastresult);
		$("#case-bugid").val(responseJson.detail.bug);
		$("#case-beforetest").val(responseJson.detail.steps.condition);
		$("#case-ontest").val(responseJson.detail.steps.teststep);
		$("#case-expect").val(responseJson.detail.steps.expresult);
		$("input:radio[value='" + responseJson.detail.type + "']").prop('checked','checked');
	} else {
		swal({
			title: "查询用例详情异常",
			text: responseJson.message,
			type: "error"
		}, function(isConfirm) {
			
		});
	}
}

function initcasefolderdetail(treeNode) {
	
	// 可以在这里创建新用例或者新文件夹
	$("#folderpage").css("display", "block");
	$("#casepage").css("display", "none");
}

/**
 * aw树的设置：带自定义Dom
 */
var awzTreeSetting = {

	data: {
		simpleData: {
			enable: true
		}
	},
	view: {
		addDiyDom: addDiyDom
	}
};

/**
 * 给aw树添加一个自定义Dom：a标签
 * 带draggable的属性
 * 并且在css中使用#awztree .node_name {display: none;}隐藏了aw数中默认的span：node name
 * 这里添加的aDom是可以独立拖动的
 */
function addDiyDom(treeId, treeNode) {

	var aObj = $("#" + treeNode.tId + "_a");
	var editStr =
		"<a href=\"javascript:void(0)\" style=\"width: 100%;height: 100%;line-height: 16px;margin-right: 2px;\" draggable=\"true\" ondragstart=\"onAWdragstart(event)\" >" +
		treeNode.name + "</a>";
	aObj.append(editStr);
};

/**
 * 这里需要获取当前节点的aw信息
 */
function onAWdragstart(event) {

}

/**
 * event.preventDefault();
 * 效果是阻止元素发生默认的行为
 */
function allowAWDrop(event) {
	event.preventDefault();
}	